/*
 * Floor.h
 *
 *  Created on: 22/04/2012
 *      Author: alex
 */

#ifndef FLOOR_H_
#define FLOOR_H_

#include <iostream>
#include <list>
#include "ElevatorPassenger.h"
#include "ApplicationCommon.h"
#include "PassengerQueue.h"
#include <cstdlib>
#include <ctime>
#include "../logger/logger.h"
#include "../common/StringUtils.h"

/**
 * Simula un piso del edificio, con la logica de generacion de pasajeros.
 */
class Floor: public Object
{
private:
    PassengerQueue *m_personQueue;
    bool m_doRun;
    bool m_doGeneratePassengers;
    FloorIdentifier m_floorId;
    int m_floorAmmount;

    static const int MAX_PASSENGER_DELAY = 10;
public:
    /**
     * Construct
     * @param pipePath path que se usara para instanciar el mecanismo de IPC
     * que se usa para comunicar el piso.
     */
	Floor(std::string pipePath, std::string keyGeneratorPath, int floorId, int floorAmmount);

	/**
	 * Destruct
	 */
    virtual ~Floor();

	/**
	 * Para el ciclo principal de la aplicacion
	 */
	void stopSimulation();

	void stopGeneratingPassengers();

	/**
	 * Comienza el ciclo principal de la simulacion de un piso
	 * Genera pasajeros en un tiempo aleatorio y los envia a traves
	 * del PassengerQueue
	 */
	void startSimulation();

	/**
	 * Espero un tiempo aleatorio y genera un pasajero.
	 * Este pasajero tiene un destino aleatorio que no puede ser el piso actual
	 * Duerme un tiempo aleatorio entre 0 y MAX_PASSENGER_DELAY para simular
	 * la aparicion de pasajeros.
	 * @returns ElevatorPassenger el pasajero creado
	 */
	ElevatorPassenger generateRandomPassenger();
};

#endif // FLOOR_H_
